什么是反射?
反射(Reflection),它允许运行中的Java程序获取自身的信息,并且可以操作类或对象的内部属性。
在Java中我们认为一切皆对象,那么对于类本身其实也是一个对象,那么它是谁的对象呢?其实它是Class类的对象。对于类来说它是Class类的类类型。
通过反射,我们可以在运行时获得程序或者程序集中每一个类型的成员和成员信息。程序中一般对象的类型在编译的时候就确定下来,通过反射机制,可以动态地创建对象并调用其属性。
通过反射,可以绕过编译期,在运行时进行创建和使用 类/方法/属性。
Java反射主要功能:
- 在运行时判断任意一个对象说属的类;
- 在运行时任意构造一个类的对象;
- 在运行时任意判断一个类的成员变量/方法;
- 在运行时任意调用一个对象的方法
获取Class对象的三种方法
1.使用Class类的forName方法
1 | // 需要异常处理 |
2.直接获取某一个对象的class
1 | Class c = String.class; |
3.调用对象的getClass()方法
1 | myClass mc = new myClass(); |
判断某个对象是否是某个类的实例
1 | boolean isIn = String.class.isInstance(str); |
创建实例
1 | try { |
获取类的信息
1 | Class c = myClass.class; |
调用方法
1 | Class c = myClass.class; |
获取类类型(类对象)注意事项
- 获取类对象的时候会导致类静态属性被初始化,而且只初始化一次,但 Class = myClass.class 不会导致静态属性被初始化。
- 前面说过,使用反射可以绕过编译,而在运行时动态的创建一个对象。因为通常我们创建实例的时候是通过new关键字,这时候如果类型不符,在编译阶段就会报错。而反射是在运行阶段的时候才被调用,因此会带来安全的问题。有利也有弊。